#  爬取携程旅游景点，游客评价的数据
import requests
from lxml import etree
import csv


#  ret: 返回数据数组
#  arr:  输入的数组
#  num: 取数组中的第几个字符串

def add(ret,title,arr,num):
 if len(arr) > num:
  ret.append(arr[num].strip())
 else:
  ret.append("")

def showPage(page,csv_writer):
 for sanming in page:
  scenic=[]
  # print("---------------------------------------------------------------------------------------")
  html1 = etree.HTML(etree.tounicode(sanming))
  add(scenic,'景点缩列图:' , html1.xpath('//div[@class="leftimg"]/a/img/@src'),0)
  add(scenic,'景点名称:' , html1.xpath('//div[@class="rdetailbox"]/dl/dt/a[1]/text()'),0)
  add(scenic,'景点主页:' , html1.xpath('//div[@class="rdetailbox"]/dl/dt/a[1]/@href'),0)
  add(scenic,'景点地址:', html1.xpath('//div[@class="rdetailbox"]/dl/dd/text()'),0)
  add(scenic,'热度:' , html1.xpath('//div[@class="rdetailbox"]/dl/dt/a[2]/b[@class="hot_score_number"]/text()'),0)
  add(scenic,'评分:' , html1.xpath('//div[@class="rdetailbox"]/ul/li[1]/a/strong/text()'),0)
  add(scenic,'点评条数:' , html1.xpath('//div[@class="rdetailbox"]/ul/li[3]/a/text()'),0)
  add(scenic,'点评地址:' , html1.xpath('//div[@class="rdetailbox"]/ul/li[3]/a/@href'),0)
  add(scenic,'最后一次评价的游客:' , html1.xpath('//p[@class="bottomcomment ellipsis open_popupbox_a"]/span/a/text()'),0)
  add(scenic,'最后一次评价:' , html1.xpath('//p[@class="bottomcomment ellipsis open_popupbox_a"]/text()'),1)
  # print("---------------------------------------------------------------------------------------")
  csv_writer.writerow(scenic)

# 下载并且保存数据,同时返回下一页的访问地址
def getPage(url,csv_writer):
 #  第一步 发送请求并且请求下载数据
 headers={'user-agent': ''}
 response = requests.get(url=url,headers=headers)
 #  解析数据
 html = etree.HTML(response.text)
 # 解析数据列表
 page = html.xpath('//div[@class="list_wide_mod2"]/div[@class="list_mod2"]')
 #  解析数据列表数据并且保存
 showPage(page,csv_writer)
 #  获取下一页的地址
 nextpage = html.xpath('//div[@class="list_wide_mod2"]/div[@class="ttd_pager cf"]/div/a[@class="nextpage"]/@href')
 #  判断下一页的下载地址是否存在
 if len(nextpage)>0 :
  return ''+nextpage[0]
 return "";


def main():
 #  第一步: 确认文件写的位置
 f= open('携程旅游景点.csv',mode='a',encoding='utf-8', newline='')
 csv_writer = csv.writer(f)
 #  第二步:  给文件写表头
 csv_writer.writerow(['景点缩列图','景点名称','景点主页','景点地址', '热度','评分','点评条数','点评地址','最后一次评价的游客','最后一次评价'])
 #  第三步: 定义资源下载地址
 url='https://you.ctrip.com/sight/sanming620/s0-p600.html'
 while url !="" :
  print("请求数据：" + url)
  #  第四步:下载并且保存数据
  url=getPage(url,csv_writer);



## 入口
main()